/***************************************************************************************************
  *Copyright(C),2010-2016,Sumscope
  *FileName	:  LevelDBCache.h
  *Author	:  scofined.qi
  *Version	:  1.0
  *Date		:  2016/09/18
  *Desc		:  //用于主要说明此程序文件完成的主要功能
  *Relation :  
  *Others	:  //其他内容说明
  *Function :  //主要函数列表，每条记录应包含函数名及功能简要说明
  *History	:  //修改历史记录列表，每条修改记录应包含修改日期、修改者及修改内容简介
***************************************************************************************************/
#pragma once

#include "HTableConfig.h"
#include "QuotaMap.h"
#include "DataBase.h"
#include "ITableCache.h"
#ifdef USE_LEVELDB

namespace leveldb{
	class DB;
}
namespace ss{
	namespace ht{
		class TableFile;
		class KeyRecordIdMap;
		class KeyRecordIdHashMap;
		class LevelDBCache : public ITableCache{
		public:
			typedef std::set<RecordId> RecordIdSet;
		protected:
			leveldb::DB *	m_level_db;			// 
			int				m_record_length;	// 单条记录的长度
			int				m_record_count;		// 总的记录个数
			RecordIdSet		m_delete_map;		// 已经删除的记录号
			KeyRecordIdHashMap*	m_key_recordmap;// key-->RecordId
			char*			m_swap_record;		// 临时交换出来的记录所保持的内存
			int				m_max_recordid;		// 当前的最大记录rid
			kDataType		m_data_type;		//
			int				m_key_bytes;		//
			std::string		m_name;
		public:
			LevelDBCache(int recordSize, kDataType type, int bytes);
			~LevelDBCache();
			int GetRecordCount()const{ return m_record_count; }
			int GetRecordLength()const{ return m_record_length; }
			bool Read(RecordId rid, char* record, int size);
			RecordId GetRecordId(const char* key);
			RecordId Write(RecordId rid, const void* record, int size, const char* key);
			int GetMaxRecordId()const{ return  m_max_recordid; }
			virtual void SetCapcity(int capcity);
			virtual const std::string& GetName(){ return m_name; }

			TableFile* GetFile(){ return 0; }
			void SetQuotaListener(QuotaMap::Listener* listener){}


			int GetMemoryBytes()const;
			int GetKeyBytes()const{ return m_key_bytes; }
			int GetSwapCount()const{ return 0; }
			int GetWriteCount()const{ return 0; }
			int GetQuotaCapcity()const{ return 0; }
			int GetQuotaLength()const{ return 0; }
		};
	}//namespace ht
}//namespace ss
#endif
